<?php

namespace app\admin\controller\fssy;

use app\common\controller\Backend;
use app\common\MyLibrary\Utils; // 引入工具类 application\admin\command\MyLibrary\Utils.php
use think\Log;
use think\Request; // 引入 Request 类
use PhpOffice\PhpSpreadsheet\Spreadsheet;  //导出表使用
use PhpOffice\PhpSpreadsheet\Cell\Coordinate; //导入表使用
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 引入 Xlsx 类
use think\exception\HttpException; // 引入 HttpException 类

/**
 * 医院基本信息季度统计表 - 生成控制器使用
 *
 * @icon fa fa-circle-o
 */
class Hospitalcount extends Backend
{

    /**
     * Hospitalcount模型对象
     * @var \app\admin\model\fssy\Hospitalcount
     */
    protected $model = null;

    protected $noNeedRight = ['gethospitalallcountdata', 'outputExcel', 'setupSheet1', 'setupSheet2', 'setupSheet3', 'setupSheet4', 'checkExportStatus', 'downloadExcel'];

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\fssy\Hospitalcount;
    }

    public function index()
    {
        // 护士基本信息表
        $this->model = new \app\admin\model\fssy\Nurseinfo();
        // 获取最小的 updatetime 数据
        $min_updatetime_nurse_data = $this->model->order('updatetime', 'asc')->limit(1)->find();
        // 获取最大的 updatetime 数据
        $max_updatetime_nurse_data = $this->model->order('updatetime', 'desc')->limit(1)->find();

        // 病区敏感数据表
        $this->model = new \app\admin\model\fssy\Areasensitivity();
        // 获取最小的 updatetime 数据
        $min_updatetime_area_data = $this->model->order('updatetime', 'asc')->limit(1)->find();
        // 获取最大的 updatetime 数据
        $max_updatetime_area_data = $this->model->order('updatetime', 'desc')->limit(1)->find();

        // 各科室指标数据表
        $this->model = new \app\admin\model\fssy\Departmentmetrics();
        // 获取最小的 updatetime 数据
        $min_updatetime_departMr_data = $this->model->order('updatetime', 'asc')->limit(1)->find();
        // 获取最大的 updatetime 数据
        $max_updatetime_departMr_data = $this->model->order('updatetime', 'desc')->limit(1)->find();

        // 找最小值
        $MinAnMaxData = Utils::findMinAndMax($min_updatetime_nurse_data['updatetime'], $min_updatetime_area_data['updatetime'], $min_updatetime_departMr_data['updatetime']);
        $min_updatetime_data = $MinAnMaxData['min'];
        // 找最大值
        $MaxAnMaxData = Utils::findMinAndMax($max_updatetime_nurse_data['updatetime'], $max_updatetime_area_data['updatetime'], $max_updatetime_departMr_data['updatetime']);
        $max_updatetime_data = $MaxAnMaxData['max'];

        // 时间戳转换成时间 返回2022-05-10 12:51:18格式
        $min_updatetime = date('Y-m-d H:i:s', $min_updatetime_data);
        // 时间戳转换成时间 返回2024-12-07 16:01:29格式
        $max_updatetime = date('Y-m-d H:i:s', $max_updatetime_data);

        // Log::record('min_updatetime = ' . $min_updatetime);
        // Log::record('max_updatetime = ' . $max_updatetime);

        // 转换成 年 季度 "2024年 四季度"
        $min_year_quarter = Utils::getQuarterInfo($min_updatetime);
        $max_year_quarter = Utils::getQuarterInfo($max_updatetime);
        // ["2023年 一季度", "2023年 二季度", ..., "2024年 四季度"]
        $quarterList = Utils::getQuartersBetween($min_year_quarter, $max_year_quarter);
        array_unshift($quarterList, ['quarter' => '']);
        $this->assign('quarterList', $quarterList);

        return $this->fetch();
    }

    /**
     *  确定 按钮 响应 事件
     *
     * @param Request $request
     * @return json 对象
     */
    public function gethospitalallcountdata(Request $request)
    {
        if ($this->request->isPost()) {

            $quarter_select = $request->post('quarter_select'); // "2023年 二季度"

            $nurseData = $this->getNurseDataFun($quarter_select);
            $areaData = $this->getAreaDataFunc($quarter_select);
            $departData = $this->getDepartTricsDataFun($quarter_select);

            $data = ['nurseData' => $nurseData, 'areaData' => $areaData, 'departData' => $departData];

            return json(['code' => 1, 'msg' => 'OK', "data" => $data]);
        }
    }
    /**
     *  获取 各科室指标 季度 统计数据
     *
     * @return 病区数据 对象
     */
    public function getDepartTricsDataFun($quarter_select)
    {
        $department = '全部科室';
        // 根据department 获取科室ID
        $this->model = new \app\admin\model\dicts\Department();
        if ($department == '全部科室') {
            $department_id = "all";  // 全部科室
        } else {
            $department_id = $this->model->where('department', $department)->value('id');
        }
        // 获取所有科室和ID 数组
        $dapartmentArr = $this->model->field('id,department')->select();

        $CheckedRangeArr = Utils::getQuarterDateRange($quarter_select); // 输入 "2023年 二季度"
        $Checked_start_date = $CheckedRangeArr['start_time'];  // 2023-04-01
        $Checked_end_date = $CheckedRangeArr['end_time'];      // 2023-06-30
        $Q_Start_End_Timestamp_Arr = Utils::signalQuarterStartEndTimestamp($Checked_start_date, $Checked_end_date); // 根据季度字符串返回季度的 开始 和 结束 日期的 时间戳格式       
        $Q_Start_Timestamp = $Q_Start_End_Timestamp_Arr['start_timestamp']; // 季度开始时间戳
        $Q_End_Timestamp = $Q_Start_End_Timestamp_Arr['end_timestamp']; // 季度结束时间戳

        // 获取指定科室的指定月份的病区敏感数据
        $this->model = new \app\admin\model\fssy\Departmentmetrics();
        $data = $this->model
            ->where('updatetime', '>=', $Q_Start_Timestamp)
            ->where('updatetime', '<=', $Q_End_Timestamp);
        if ($department_id !== "all") {
            $data = $data->where("department_id", '=', $department_id);
        }
        $data = $data->select();

        // 循环$data 数组 把时间戳转换成时间格式
        foreach ($data as $index => $item) {
            $item['updateDate'] = date('Y-m-d', $item['updatetime']);
            unset($item['createtime']);
            unset($item['updatetime']);
            // 循环$dapartmentArr 数组 找到科室
            foreach ($dapartmentArr as $i => $elem) {
                if ($elem['id'] == $item['department_id']) {
                    $item['departmentName'] = $elem['department'];
                }
            }
        }

        // 按 科室名称 分类
        $departClassDataArr = [];
        foreach ($data as $key => $value) {
            $departClassDataArr[$value['departmentName']][] = $value;
        };

        return $departClassDataArr;
        // return json(['code' => 1, 'msg' => 'OK', 'data' => $departClassDataArr]);
    }


    /**
     *  获取 病区敏感 季度 统计数据
     *
     * @return 病区数据 对象
     */
    function getAreaDataFunc($quarter_select)
    {
        $CheckedRangeArr = Utils::getQuarterDateRange($quarter_select); // 输入 "2023年 二季度"
        $Checked_start_date = $CheckedRangeArr['start_time'];  // 2023-04-01
        $Checked_end_date = $CheckedRangeArr['end_time'];      // 2023-06-30
        $Q_Start_End_Timestamp_Arr = Utils::signalQuarterStartEndTimestamp($Checked_start_date, $Checked_end_date); // 根据季度字符串返回季度的 开始 和 结束 日期的 时间戳格式       
        $Q_Start_Timestamp = $Q_Start_End_Timestamp_Arr['start_timestamp']; // 季度开始时间戳
        $Q_End_Timestamp = $Q_Start_End_Timestamp_Arr['end_timestamp']; // 季度结束时间戳

        $AreaModel = new \app\admin\model\fssy\Areasensitivity;
        $AreaData = $AreaModel
            ->with(['department'])
            ->where('areasensitivity.updatetime', 'between', [$Q_Start_Timestamp, $Q_End_Timestamp])
            ->select();

        // 循环 整理 数据 把 科室名称 加到 病区敏感数据中
        foreach ($AreaData as $key => $value) {
            $AreaData[$key]['departmentName'] = $value['department']['department'];
            // 删除 department 对象
            unset($AreaData[$key]['department']);
        };

        // 按 科室名称 分类
        $AreaDataArr = [];
        foreach ($AreaData as $key => $value) {
            $AreaDataArr[$value['departmentName']][] = $value;
        };

        return $AreaDataArr;
    }

    /**
     *  获取 护士 季度 统计数据
     *
     * @return 护士 对象
     */
    function getNurseDataFun($quarter_select)
    {
        // 根据季度信息字符串返回季度的开始和结束日期 2023年 一季度  => ["start_time" => "2023-01-01", "start_time" => "2023-03-31"]
        $CheckedRangeArr = Utils::getQuarterDateRange($quarter_select); // 输入 "2023年 二季度"
        $Checked_start_date = $CheckedRangeArr['start_time'];  // 2023-04-01
        $Checked_end_date = $CheckedRangeArr['end_time'];      // 2023-06-30

        // 返回上一个季度
        $PriviousQuarter = Utils::getPreviousQuarter($quarter_select); // "2022年 四季度"
        $PriviousRangeArr = Utils::getQuarterDateRange($PriviousQuarter); //  start_time: =>"2022-10-01",   end_time:=> "2022-12-31"
        $Privious_start_date = $PriviousRangeArr['start_time'];  // 2023-01-01
        $Privious_end_date = $PriviousRangeArr['end_time'];      // 2023-03-31

        $departmentModel = new \app\admin\model\dicts\Department;
        $departmentList = $departmentModel->field('department')->select();
        // Log::record('$departmentList = ' . json_encode($departmentList));
        // 遍历查询结果，并添加到数组中
        foreach ($departmentList as $item) {
            $departmentArr[] = $item['department'];
        };
        // 添加"全部科室"
        array_push($departmentArr, '全部科室');

        $resultData = [];

        // 循环科室，查询各科室季度数据
        foreach ($departmentArr as $department) {
            // 查询nuserinfo表，季报 职称人数、学历人数、年资人数数据
            $CheckedData = Utils::getNurseQuarterCountData($department, $Checked_start_date, $Checked_end_date);
            $PriviousData = Utils::getNurseQuarterCountData($department, $Privious_start_date, $Privious_end_date);

            // 检查并提取 CheckedData 中的数据
            if (!empty($CheckedData['jobTitleQuarterArr']) && !empty($CheckedData['educationBakQuarterArr']) && !empty($CheckedData['yearPayQuarterArr'])) {
                $CheckedData['jobTitleQuarter'] = $CheckedData['jobTitleQuarterArr'][0];
                $CheckedData['educationBakQuarter'] = $CheckedData['educationBakQuarterArr'][0];
                $CheckedData['yearPayQuarter'] = $CheckedData['yearPayQuarterArr'][0];
                unset($CheckedData['jobTitleQuarterArr']);
                unset($CheckedData['educationBakQuarterArr']);
                unset($CheckedData['yearPayQuarterArr']);
            }
            // 检查并提取 PriviousData 中的数据
            if (!empty($PriviousData['jobTitleQuarterArr']) && !empty($PriviousData['educationBakQuarterArr']) && !empty($PriviousData['yearPayQuarterArr'])) {
                $PriviousData['jobTitleQuarter'] = $PriviousData['jobTitleQuarterArr'][0];
                $PriviousData['educationBakQuarter'] = $PriviousData['educationBakQuarterArr'][0];
                $PriviousData['yearPayQuarter'] = $PriviousData['yearPayQuarterArr'][0];
                unset($PriviousData['jobTitleQuarterArr']);
                unset($PriviousData['educationBakQuarterArr']);
                unset($PriviousData['yearPayQuarterArr']);
            }

            // 添加到结果数组中
            // 添加到结果数组中
            $resultData[$department] = [
                'CheckedData' => $CheckedData,
                'PriviousData' => $PriviousData,
            ];
        }

        return $resultData;
    }

    /**
     *  导出Excel表
     *
     * @return json 对象
     */
    public function outputExcel(Request $request)
    {
        if ($this->request->isPost()) {
            $jsonData = $request->post(); // 直接接收 POST 数据  自动转换成数组
            // 将 JSON 数据解码为关联数组
            $quarter_select = $jsonData["quarter_select"];
            $departTargetQuarter = $jsonData["departTargetQuarter"];
            $areaDataQuarter = $jsonData["areaDataQuarter"];
            $jobTitleQuarter = $jsonData["jobTitleQuarter"];
            $educationBakQuarter = $jsonData["educationBakQuarter"];
            $yearPayQuarter = $jsonData["yearPayQuarter"];
            $departments = [
                'ICU',
                '外科',
                '胸外',
                '乳一',
                '乳二',
                '妇科',
                '内一',
                '内二',
                '放一',
                '放二',
                '放三',
                '结一',
                '结二',
                '结三',
                '放射科',
                '供应室',
                'ECT',
                '配液',
                '窥镜',
                '结门',
                '门诊',
                '手术室',
                '功能科',
                '护理部',
                '总数'
            ];

            try {
                $spreadsheet = new Spreadsheet();

                // 创建并设置 各科室指标统计表
                $sheet1 = $spreadsheet->getActiveSheet();
                $sheet1->setTitle('各科室指标统计表');
                $this->setupSheet1($sheet1, $quarter_select, $departTargetQuarter, '各科室指标统计表', $departments);

                // 创建并设置 病区敏感数据统计表\
                $sheet2 = $spreadsheet->createSheet();
                $sheet2->setTitle('病区敏感数据统计表');
                $this->setupSheet2($sheet2, $quarter_select, $areaDataQuarter, '病区敏感数据统计表', $departments);

                // 创建并设置 护士职称统计表
                $sheet2 = $spreadsheet->createSheet();
                $sheet2->setTitle('护士职称统计表');
                $this->setupSheet3($sheet2, $quarter_select, $jobTitleQuarter, '护士职称统计表', $departments);

                // 创建并设置 护士学历统计表
                $sheet2 = $spreadsheet->createSheet();
                $sheet2->setTitle('护士学历统计表');
                $this->setupSheet3($sheet2, $quarter_select, $educationBakQuarter, '护士学历统计表', $departments);

                // 创建并设置 护士年金统计表
                $sheet2 = $spreadsheet->createSheet();
                $sheet2->setTitle('护士年金统计表');
                $this->setupSheet4($sheet2, $quarter_select, $yearPayQuarter, '护士年金统计表', $departments);

                // 设置默认活动工作表为“各科室指标统计表”
                $spreadsheet->setActiveSheetIndex(0);

                // **** 保存文件 ****  
                date_default_timezone_set('Asia/Shanghai');
                $fileToken = '医院基本信息数据统计表_' . $quarter_select . '=' . date('Y-m-d_H-i-s');
                $directory = 'output' . DIRECTORY_SEPARATOR . 'excel' . DIRECTORY_SEPARATOR;
                $filePath = ROOT_PATH . $directory . $fileToken . '.xlsx';

                if (!is_dir($directory)) {
                    mkdir($directory, 0755, true); // 创建目录
                }
                // 创建 writer 对象来保存文件
                $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
                $writer->save($filePath);

                // 返回文件标识符
                return json(['code' => 1, 'msg' => '文件生成成功', 'data' => ['fileToken' => $fileToken]]);
            } catch (\Exception $e) {
                // 捕获异常并返回错误信息
                return json(['code' => 0, 'msg' => '导出失败: ' . $e->getMessage()]);
            }
        } else {
            // 如果不是 POST 请求，返回错误信息
            return json(['code' => 0, 'msg' => '请求方法错误']);
        }
    }

    private function setupSheet1($sheet1, $quarter_select, $data, $title, $departments)
    {
        // 设置整个工作表的字体为宋体，字号为10
        $fontStyle = [
            'font' => [
                'name' => '宋体',
                'size' => 9.5,
            ]
        ];
        // 应用字体样式到整个工作表的有效区域（可以调整范围）
        $sheet1->getStyle('A4:Z27')->applyFromArray($fontStyle);

        // 设置纸张方向为横向
        $sheet1->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

        // **** 行高 ****
        // 设置第4行的行高为26
        $sheet1->getRowDimension('3')->setRowHeight(26);
        $sheet1->getRowDimension('4')->setRowHeight(26);
        // 其他行高 单位 -> 磅
        $sheet1->getDefaultRowDimension()->setRowHeight(16);

        // **** 列宽 ****
        // 列宽 单位 -> 字符
        $sheet1->getColumnDimension('A')->setWidth(23); // 设置第一列（A列）的宽度为19.29字符
        $sheet1->getDefaultColumnDimension()->setWidth(4.4); // 其他列的默认宽度

        // **** 文字 对齐 ****
        // 设置整个工作表的列居中
        $sheet1->getStyle($sheet1->calculateWorksheetDimension())->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
        // A列 局左
        $sheet1->getStyle('A1:A50')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);

        // **** 边框 ****
        // A:4 到 Z:27 设置所有边框
        $borderStyle = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '000000'],
                ],
            ],
        ];
        $sheet1->getStyle('A4:Z27')->applyFromArray($borderStyle);

        // **** 页边距 ****
        // 设置页边距
        $sheet1->getPageMargins()->setTop(0.752); // 上边距为1英寸
        $sheet1->getPageMargins()->setRight(0.1); // 右边距为0.75英寸
        $sheet1->getPageMargins()->setBottom(0.752); // 下边距为1英寸
        $sheet1->getPageMargins()->setLeft(0.1); // 左边距为0.75英寸
        $sheet1->getPageMargins()->setHeader(0.3); // 页眉边距为0.3英寸
        $sheet1->getPageMargins()->setFooter(0.3); // 页脚边距为0.3英寸

        // **** 标题 ****
        // A:1 到 Z:2 合并
        $sheet1->mergeCells('A1:Z2');
        // 设置标题
        $sheet1->setCellValue('A1', $title);
        // 设置字体颜色
        $sheet1->getStyle('A1')->getFont()->getColor()->setARGB('FF000000');
        // 设置字体大小
        $sheet1->getStyle('A1')->getFont()->setSize(14);
        // 设置字体加粗
        $sheet1->getStyle('A1')->getFont()->setBold(true);
        // A1 居中
        $sheet1->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);

        // **** 季度和时间 ****
        // A:3 
        $sheet1->setCellValue('A3',  '季度: ' . $quarter_select);
        $sheet1->mergeCells('T3:Z3');
        // U:3 局右
        $sheet1->getStyle('T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
        $nowTime = date('Y-m-d H:i:s');
        $sheet1->setCellValue('T3', '制表时间: ' . $nowTime);
        // 上下居中
        $sheet1->getStyle('A3:Z3')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);

        // **** 表头 ****
        // 设置表头行
        $sheet1->setCellValue('A4', '项目\科室');
        // 填写其他科室的列标题
        foreach ($departments as $index => $department) {
            $column = chr(65 + $index + 1); // 计算列字母
            $sheet1->setCellValue($column . '4', $department);
        }
        // 设置表头单元格自动换行
        $sheet1->getStyle('A4:' . $column . '4')->getAlignment()->setWrapText(true);
        // 设置表头字体为粗体
        $sheet1->getStyle('A4:' . $column . '4')->getFont()->setBold(true);
        // 设置表头背景色
        $sheet1->getStyle('A4:' . $column . '4')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('EAEAEA');

        // **** 表 数据和样式 ****
        // 设置数据行
        $row = 5; // 从第5行开始填充数据
        foreach ($data as $key => $values) {
            $sheet1->setCellValue('A' . $row, $key);
            foreach ($values as $colIndex => $value) {
                $column = chr(65 + $colIndex + 1); // 计算列字母
                $sheet1->setCellValue($column . $row, $value);
                // 设置偶数行背景色为蓝色
                if ($row % 2 == 0) {
                    $sheet1->getStyle('A' . $row . ':' . $column . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('D9EDF7'); // 蓝色背景
                }
            }
            // 设置最后一列背景色为黄色
            $lastColumn = chr(65 + count($departments)); // 计算最后一列字母
            $sheet1->getStyle($lastColumn . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色

            $row++;
        }
    }

    private function setupSheet2($sheet, $quarter_select, $data, $title, $departments)
    {
        // 设置整个工作表的字体为宋体，字号为10
        $fontStyle = [
            'font' => [
                'name' => '宋体',
                'size' => 9.5,
            ]
        ];
        // 应用字体样式到整个工作表的有效区域（可以调整范围）
        $sheet->getStyle('A4:Z21')->applyFromArray($fontStyle);

        // 设置纸张方向为横向
        $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

        // **** 行高 ****
        // 设置第4行的行高为26
        $sheet->getRowDimension('3')->setRowHeight(26);
        $sheet->getRowDimension('4')->setRowHeight(26);
        // 其他行高 单位 -> 磅
        $sheet->getDefaultRowDimension()->setRowHeight(16);

        // **** 列宽 ****
        // 列宽 单位 -> 字符
        $sheet->getColumnDimension('A')->setWidth(21); // 设置第一列（A列）的宽度为19.29字符
        $sheet->getDefaultColumnDimension()->setWidth(4.6); // 其他列的默认宽度

        // **** 文字 对齐 ****
        // 设置整个工作表的列居中
        $sheet->getStyle($sheet->calculateWorksheetDimension())->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
        // A列 局左
        $sheet->getStyle('A1:A50')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);

        // **** 边框 ****
        // A:4 到 Z:27 设置所有边框
        $borderStyle = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '000000'],
                ],
            ],
        ];
        $sheet->getStyle('A4:Z21')->applyFromArray($borderStyle);

        // **** 页边距 ****
        // 设置页边距
        $sheet->getPageMargins()->setTop(0.752); // 上边距为1英寸
        $sheet->getPageMargins()->setRight(0.1); // 右边距为0.75英寸
        $sheet->getPageMargins()->setBottom(0.752); // 下边距为1英寸
        $sheet->getPageMargins()->setLeft(0.1); // 左边距为0.75英寸
        $sheet->getPageMargins()->setHeader(0.3); // 页眉边距为0.3英寸
        $sheet->getPageMargins()->setFooter(0.3); // 页脚边距为0.3英寸

        // **** 标题 ****
        // A:1 到 Z:2 合并
        $sheet->mergeCells('A1:Z2');
        // 设置标题
        $sheet->setCellValue('A1', $title);
        // 设置字体颜色
        $sheet->getStyle('A1')->getFont()->getColor()->setARGB('FF000000');
        // 设置字体大小
        $sheet->getStyle('A1')->getFont()->setSize(14);
        // 设置字体加粗
        $sheet->getStyle('A1')->getFont()->setBold(true);
        // A1 居中
        $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);

        // **** 季度和时间 ****
        // A:3 
        $sheet->setCellValue('A3',  '季度: ' . $quarter_select);
        $sheet->mergeCells('T3:Z3');
        // U:3 局右
        $sheet->getStyle('T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
        $nowTime = date('Y-m-d H:i:s');
        $sheet->setCellValue('T3', '制表时间: ' . $nowTime);
        // 上下居中
        $sheet->getStyle('A3:Z3')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);

        // **** 表头 ****
        // 设置表头行
        $sheet->setCellValue('A4', '项目\科室');
        // 填写其他科室的列标题
        foreach ($departments as $index => $department) {
            $column = chr(65 + $index + 1); // 计算列字母
            $sheet->setCellValue($column . '4', $department);
        }
        // 设置表头单元格自动换行
        $sheet->getStyle('A4:' . $column . '4')->getAlignment()->setWrapText(true);
        // 设置表头字体为粗体
        $sheet->getStyle('A4:' . $column . '4')->getFont()->setBold(true);
        // 设置表头背景色
        $sheet->getStyle('A4:' . $column . '4')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('EAEAEA');

        // **** 表 数据和样式 ****
        // 设置数据行
        $row = 5; // 从第5行开始填充数据
        foreach ($data as $key => $values) {
            $sheet->setCellValue('A' . $row, $key);
            foreach ($values as $colIndex => $value) {
                $column = chr(65 + $colIndex + 1); // 计算列字母
                $sheet->setCellValue($column . $row, $value);
                // 设置偶数行背景色为蓝色
                if ($row % 2 == 0) {
                    $sheet->getStyle('A' . $row . ':' . $column . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('D9EDF7'); // 蓝色背景
                }
            }
            // 设置最后一列背景色为黄色
            $lastColumn = chr(65 + count($departments)); // 计算最后一列字母
            $sheet->getStyle($lastColumn . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色

            $row++;
        }
    }

    private function setupSheet3($sheet, $quarter_select, $data, $title, $departments)
    {
        // 设置整个工作表的字体为宋体，字号为10
        $fontStyle = [
            'font' => [
                'name' => '宋体',
                'size' => 9.5,
            ]
        ];
        // 应用字体样式到整个工作表的有效区域（可以调整范围）
        $sheet->getStyle('A4:Z15')->applyFromArray($fontStyle);

        // 设置纸张方向为横向
        $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

        // **** 行高 ****
        // 设置第4行的行高为26
        $sheet->getRowDimension('3')->setRowHeight(26);
        $sheet->getRowDimension('4')->setRowHeight(26);
        // 其他行高 单位 -> 磅
        $sheet->getDefaultRowDimension()->setRowHeight(16);

        // **** 列宽 ****
        // 列宽 单位 -> 字符
        $sheet->getColumnDimension('A')->setWidth(21); // 设置第一列（A列）的宽度为19.29字符
        $sheet->getDefaultColumnDimension()->setWidth(4.6); // 其他列的默认宽度

        // **** 文字 对齐 ****
        // 设置整个工作表的列居中
        $sheet->getStyle($sheet->calculateWorksheetDimension())->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
        // A列 局左
        $sheet->getStyle('A1:A50')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);

        // **** 边框 ****
        // A:4 到 Z:27 设置所有边框
        $borderStyle = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '000000'],
                ],
            ],
        ];
        $sheet->getStyle('A4:Z15')->applyFromArray($borderStyle);

        // **** 页边距 ****
        // 设置页边距
        $sheet->getPageMargins()->setTop(0.752); // 上边距为1英寸
        $sheet->getPageMargins()->setRight(0.1); // 右边距为0.75英寸
        $sheet->getPageMargins()->setBottom(0.752); // 下边距为1英寸
        $sheet->getPageMargins()->setLeft(0.1); // 左边距为0.75英寸
        $sheet->getPageMargins()->setHeader(0.3); // 页眉边距为0.3英寸
        $sheet->getPageMargins()->setFooter(0.3); // 页脚边距为0.3英寸

        // **** 标题 ****
        // A:1 到 Z:2 合并
        $sheet->mergeCells('A1:Z2');
        // 设置标题
        $sheet->setCellValue('A1', $title);
        // 设置字体颜色
        $sheet->getStyle('A1')->getFont()->getColor()->setARGB('FF000000');
        // 设置字体大小
        $sheet->getStyle('A1')->getFont()->setSize(14);
        // 设置字体加粗
        $sheet->getStyle('A1')->getFont()->setBold(true);
        // A1 居中
        $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);

        // **** 季度和时间 ****
        // A:3 
        $sheet->setCellValue('A3',  '季度: ' . $quarter_select);
        $sheet->mergeCells('T3:Z3');
        // U:3 局右
        $sheet->getStyle('T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
        $nowTime = date('Y-m-d H:i:s');
        $sheet->setCellValue('T3', '制表时间: ' . $nowTime);
        // 上下居中
        $sheet->getStyle('A3:Z3')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);

        // **** 表头 ****
        // 设置表头行
        $sheet->setCellValue('A4', '项目\科室');
        // 填写其他科室的列标题
        foreach ($departments as $index => $department) {
            $column = chr(65 + $index + 1); // 计算列字母
            $sheet->setCellValue($column . '4', $department);
        }
        // 设置表头单元格自动换行
        $sheet->getStyle('A4:' . $column . '4')->getAlignment()->setWrapText(true);
        // 设置表头字体为粗体
        $sheet->getStyle('A4:' . $column . '4')->getFont()->setBold(true);
        // 设置表头背景色
        $sheet->getStyle('A4:' . $column . '4')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('EAEAEA');

        // **** 表 数据和样式 ****
        // 设置数据行
        $row = 5; // 从第5行开始填充数据
        foreach ($data as $key => $values) {
            $sheet->setCellValue('A' . $row, $key);
            foreach ($values as $colIndex => $value) {
                $column = chr(65 + $colIndex + 1); // 计算列字母
                $sheet->setCellValue($column . $row, $value);
                // 设置偶数行背景色为蓝色
                if ($row % 2 == 0) {
                    $sheet->getStyle('A' . $row . ':' . $column . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('D9EDF7'); // 蓝色背景
                }
            }
            // 设置最后一列背景色为黄色
            $lastColumn = chr(65 + count($departments)); // 计算最后一列字母
            $sheet->getStyle($lastColumn . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色

            $row++;
        }
        // 设置最后一行的背景颜色为黄色
        $lastRow = $row - 1; // 最后一行的行号
        $sheet->getStyle('A' . $lastRow . ':' . $lastColumn . $lastRow)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色背景
    }

    private function setupSheet4($sheet, $quarter_select, $data, $title, $departments)
    {
        // 设置整个工作表的字体为宋体，字号为10
        $fontStyle = [
            'font' => [
                'name' => '宋体',
                'size' => 9.5,
            ]
        ];
        // 应用字体样式到整个工作表的有效区域（可以调整范围）
        $sheet->getStyle('A4:Z17')->applyFromArray($fontStyle);

        // 设置纸张方向为横向
        $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

        // **** 行高 ****
        // 设置第4行的行高为26
        $sheet->getRowDimension('3')->setRowHeight(26);
        $sheet->getRowDimension('4')->setRowHeight(26);
        // 其他行高 单位 -> 磅
        $sheet->getDefaultRowDimension()->setRowHeight(16);

        // **** 列宽 ****
        // 列宽 单位 -> 字符
        $sheet->getColumnDimension('A')->setWidth(21); // 设置第一列（A列）的宽度为19.29字符
        $sheet->getDefaultColumnDimension()->setWidth(4.6); // 其他列的默认宽度

        // **** 文字 对齐 ****
        // 设置整个工作表的列居中
        $sheet->getStyle($sheet->calculateWorksheetDimension())->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
        // A列 局左
        $sheet->getStyle('A1:A50')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);

        // **** 边框 ****
        // A:4 到 Z:27 设置所有边框
        $borderStyle = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '000000'],
                ],
            ],
        ];
        $sheet->getStyle('A4:Z17')->applyFromArray($borderStyle);

        // **** 页边距 ****
        // 设置页边距
        $sheet->getPageMargins()->setTop(0.752); // 上边距为1英寸
        $sheet->getPageMargins()->setRight(0.1); // 右边距为0.75英寸
        $sheet->getPageMargins()->setBottom(0.752); // 下边距为1英寸
        $sheet->getPageMargins()->setLeft(0.1); // 左边距为0.75英寸
        $sheet->getPageMargins()->setHeader(0.3); // 页眉边距为0.3英寸
        $sheet->getPageMargins()->setFooter(0.3); // 页脚边距为0.3英寸

        // **** 标题 ****
        // A:1 到 Z:2 合并
        $sheet->mergeCells('A1:Z2');
        // 设置标题
        $sheet->setCellValue('A1', $title);
        // 设置字体颜色
        $sheet->getStyle('A1')->getFont()->getColor()->setARGB('FF000000');
        // 设置字体大小
        $sheet->getStyle('A1')->getFont()->setSize(14);
        // 设置字体加粗
        $sheet->getStyle('A1')->getFont()->setBold(true);
        // A1 居中
        $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);

        // **** 季度和时间 ****
        // A:3 
        $sheet->setCellValue('A3',  '季度: ' . $quarter_select);
        $sheet->mergeCells('T3:Z3');
        // U:3 局右
        $sheet->getStyle('T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
        $nowTime = date('Y-m-d H:i:s');
        $sheet->setCellValue('T3', '制表时间: ' . $nowTime);
        // 上下居中
        $sheet->getStyle('A3:Z3')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);

        // **** 表头 ****
        // 设置表头行
        $sheet->setCellValue('A4', '项目\科室');
        // 填写其他科室的列标题
        foreach ($departments as $index => $department) {
            $column = chr(65 + $index + 1); // 计算列字母
            $sheet->setCellValue($column . '4', $department);
        }
        // 设置表头单元格自动换行
        $sheet->getStyle('A4:' . $column . '4')->getAlignment()->setWrapText(true);
        // 设置表头字体为粗体
        $sheet->getStyle('A4:' . $column . '4')->getFont()->setBold(true);
        // 设置表头背景色
        $sheet->getStyle('A4:' . $column . '4')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('EAEAEA');

        // **** 表 数据和样式 ****
        // 设置数据行
        $row = 5; // 从第5行开始填充数据
        foreach ($data as $key => $values) {
            $sheet->setCellValue('A' . $row, $key);
            foreach ($values as $colIndex => $value) {
                $column = chr(65 + $colIndex + 1); // 计算列字母
                $sheet->setCellValue($column . $row, $value);
                // 设置偶数行背景色为蓝色
                if ($row % 2 == 0) {
                    $sheet->getStyle('A' . $row . ':' . $column . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('D9EDF7'); // 蓝色背景
                }
            }
            // 设置最后一列背景色为黄色
            $lastColumn = chr(65 + count($departments)); // 计算最后一列字母
            $sheet->getStyle($lastColumn . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色

            $row++;
        }
        // 设置最后一行的背景颜色为黄色
        $lastRow = $row - 1; // 最后一行的行号
        $sheet->getStyle('A' . $lastRow . ':' . $lastColumn . $lastRow)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色背景
    }

    // public function outputExcel2(Request $request)
    // {
    //     if ($this->request->isPost()) {
    //         $jsonData = $request->post(); // 直接接收 POST 数据  自动转换成数组
    //         // 将 JSON 数据解码为关联数组
    //         $quarter_select = $jsonData["quarter_select"];
    //         $departTargetQuarter = $jsonData["departTargetQuarter"];
    //         $areaDataQuarter = $jsonData["areaDataQuarter"];
    //         $jobTitleQuarter = $jsonData["jobTitleQuarter"];
    //         $educationBakQuarter = $jsonData["educationBakQuarter"];
    //         $yearPayQuarter = $jsonData["yearPayQuarter"];
    //         $departments = [
    //             'ICU',
    //             '外科',
    //             '胸外',
    //             '乳一',
    //             '乳二',
    //             '妇科',
    //             '内一',
    //             '内二',
    //             '放一',
    //             '放二',
    //             '放三',
    //             '结一',
    //             '结二',
    //             '结三',
    //             '放射科',
    //             '供应室',
    //             'ECT',
    //             '配液',
    //             '窥镜',
    //             '结门',
    //             '门诊',
    //             '手术室',
    //             '功能科',
    //             '护理部',
    //             '总数'
    //         ];

    //         try {
    //             $spreadsheet = new Spreadsheet();
    //             $sheet1 = $spreadsheet->getActiveSheet('Sheet1');

    //             // **** 重命名工作表 ****
    //             $sheet1->setTitle('各科室指标统计表');

    //             // 设置整个工作表的字体为宋体，字号为10
    //             $fontStyle = [
    //                 'font' => [
    //                     'name' => '宋体',
    //                     'size' => 10,
    //                 ]
    //             ];
    //             // 应用字体样式到整个工作表的有效区域（可以调整范围）
    //             $sheet1->getStyle('A4:Z27')->applyFromArray($fontStyle);

    //             // 设置纸张方向为横向
    //             $sheet1->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

    //             // **** 行高 ****
    //             // 设置第4行的行高为26
    //             $sheet1->getRowDimension('3')->setRowHeight(26);
    //             $sheet1->getRowDimension('4')->setRowHeight(26);
    //             // 其他行高 单位 -> 磅
    //             $sheet1->getDefaultRowDimension()->setRowHeight(16);

    //             // **** 列宽 ****
    //             // 列宽 单位 -> 字符
    //             $sheet1->getColumnDimension('A')->setWidth(23); // 设置第一列（A列）的宽度为19.29字符
    //             $sheet1->getDefaultColumnDimension()->setWidth(4.4); // 其他列的默认宽度

    //             // **** 文字 对齐 ****
    //             // 设置整个工作表的列居中
    //             $sheet1->getStyle($sheet1->calculateWorksheetDimension())->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
    //             // A列 局左
    //             $sheet1->getStyle('A1:A50')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);

    //             // **** 边框 ****
    //             // A:4 到 Z:27 设置所有边框
    //             $borderStyle = [
    //                 'borders' => [
    //                     'allBorders' => [
    //                         'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
    //                         'color' => ['argb' => '000000'],
    //                     ],
    //                 ],
    //             ];
    //             $sheet1->getStyle('A4:Z27')->applyFromArray($borderStyle);

    //             // **** 页边距 ****
    //             // 设置页边距
    //             $sheet1->getPageMargins()->setTop(0.752); // 上边距为1英寸
    //             $sheet1->getPageMargins()->setRight(0.1); // 右边距为0.75英寸
    //             $sheet1->getPageMargins()->setBottom(0.752); // 下边距为1英寸
    //             $sheet1->getPageMargins()->setLeft(0.1); // 左边距为0.75英寸
    //             $sheet1->getPageMargins()->setHeader(0.3); // 页眉边距为0.3英寸
    //             $sheet1->getPageMargins()->setFooter(0.3); // 页脚边距为0.3英寸

    //             // **** 标题 ****
    //             // A:1 到 Z:2 合并
    //             $sheet1->mergeCells('A1:Z2');
    //             // 设置标题
    //             $sheet1->setCellValue('A1', '各科室指标统计表');
    //             // 设置字体颜色
    //             $sheet1->getStyle('A1')->getFont()->getColor()->setARGB('FF000000');
    //             // 设置字体大小
    //             $sheet1->getStyle('A1')->getFont()->setSize(14);
    //             // 设置字体加粗
    //             $sheet1->getStyle('A1')->getFont()->setBold(true);
    //             // A1 居中
    //             $sheet1->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);

    //             // **** 季度和时间 ****
    //             // A:3 
    //             $sheet1->setCellValue('A3',  '季度: ' . $quarter_select);
    //             $sheet1->mergeCells('T3:Z3');
    //             // U:3 局右
    //             $sheet1->getStyle('T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
    //             $nowTime = date('Y-m-d H:i:s');
    //             $sheet1->setCellValue('T3', '制表时间: ' . $nowTime);
    //             // 上下居中
    //             $sheet1->getStyle('A3:Z3')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);


    //             // **** 表头 ****
    //             // 设置表头行
    //             $sheet1->setCellValue('A4', '项目\科室');
    //             // 填写其他科室的列标题
    //             foreach ($departments as $index => $department) {
    //                 $column = chr(65 + $index + 1); // 计算列字母
    //                 $sheet1->setCellValue($column . '4', $department);
    //             }
    //             // 设置表头单元格自动换行
    //             $sheet1->getStyle('A4:' . $column . '4')->getAlignment()->setWrapText(true);
    //             // 设置表头字体为粗体
    //             $sheet1->getStyle('A4:' . $column . '4')->getFont()->setBold(true);
    //             // 设置表头背景色
    //             $sheet1->getStyle('A4:' . $column . '4')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('EAEAEA');


    //             // **** 表 数据和样式 ****
    //             // 设置数据行
    //             $row = 5; // 从第5行开始填充数据
    //             foreach ($departTargetQuarter as $key => $values) {
    //                 $sheet1->setCellValue('A' . $row, $key);
    //                 foreach ($values as $colIndex => $value) {
    //                     $column = chr(65 + $colIndex + 1); // 计算列字母
    //                     $sheet1->setCellValue($column . $row, $value);
    //                     // 设置偶数行背景色为蓝色
    //                     if ($row % 2 == 0) {
    //                         $sheet1->getStyle('A' . $row . ':' . $column . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('D9EDF7'); // 蓝色背景
    //                     }
    //                 }
    //                 // 设置最后一列背景色为黄色
    //                 $lastColumn = chr(65 + count($departments)); // 计算最后一列字母
    //                 $sheet1->getStyle($lastColumn . $row)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('FCF8E3'); // 黄色

    //                 $row++;
    //             }

    //             // **** 保存文件 ****  
    //             date_default_timezone_set('Asia/Shanghai');
    //             $fileToken = '医院基本信息数据统计表_' . $quarter_select . '=' . date('Y-m-d_H-i-s');
    //             $directory = 'output' . DIRECTORY_SEPARATOR . 'excel' . DIRECTORY_SEPARATOR;
    //             $filePath = ROOT_PATH . $directory . $fileToken . '.xlsx';

    //             if (!is_dir($directory)) {
    //                 mkdir($directory, 0755, true); // 创建目录
    //             }
    //             // 创建 writer 对象来保存文件
    //             $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
    //             $writer->save($filePath);

    //             // 返回文件标识符
    //             return json(['code' => 1, 'msg' => '文件生成成功', 'data' => ['fileToken' => $fileToken]]);


    //             // // 创建 writer 对象来保存文件
    //             // $writer = new Xlsx($spreadsheet);
    //             // // 设置响应头
    //             // header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    //             // header('Content-Disposition: attachment;filename="考生数据.xlsx"');
    //             // header('Cache-Control: max-age=0');
    //             // header('Cache-Control: must-revalidate'); // 强制浏览器重新验证缓存
    //             // header('Pragma: public'); // 对于 HTTP/1.0 兼容性
    //             // header('Expires: 0'); // 确保文件立即到期，避免缓存
    //             // // 检查并清理缓冲区
    //             // if (ob_get_level()) {
    //             //     ob_clean();
    //             // }
    //             // // 刷新缓冲区
    //             // flush();
    //             // // 输出文件到浏览器
    //             // $writer->save('php://output');
    //             // exit;
    //         } catch (\Exception $e) {
    //             // 捕获异常并返回错误信息
    //             return json(['code' => 0, 'msg' => '导出失败: ' . $e->getMessage()]);
    //         }
    //     } else {
    //         // 如果不是 POST 请求，返回错误信息
    //         return json(['code' => 0, 'msg' => '请求方法错误']);
    //     }
    // }

    /**
     * 检查文件是否已生成
     */
    public function checkExportStatus(Request $request)
    {
        $fileToken = htmlspecialchars($this->request->get('fileToken'), ENT_QUOTES, 'UTF-8');
        $directory = 'output' . DIRECTORY_SEPARATOR . 'excel' . DIRECTORY_SEPARATOR;
        $filePath = ROOT_PATH . $directory . $fileToken . '.xlsx';

        if (file_exists($filePath)) {
            return json(['code' => 1, 'msg' => '文件已生成', 'data' => ['ready' => true]]);
        } else {
            return json(['code' => 1, 'msg' => '文件未生成', 'data' => ['ready' => false]]);
        }
    }

    /**
     * 下载 Excel 文件
     */
    public function downloadExcel(Request $request)
    {
        try {
            $fileToken = htmlspecialchars($this->request->get('fileToken'), ENT_QUOTES, 'UTF-8');
            $directory = 'output' . DIRECTORY_SEPARATOR . 'excel' . DIRECTORY_SEPARATOR;
            $filePath = ROOT_PATH . $directory . $fileToken . '.xlsx';

            if (file_exists($filePath)) {
                // 设置响应头
                header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                header('Content-Disposition: attachment;filename="' . $fileToken . '.xlsx"');
                header('Cache-Control: max-age=0');
                header('Pragma: public');
                header('Expires: 0');

                // 输出文件
                readfile($filePath);
                exit;
            } else {
                return json(['code' => 0, 'msg' => '文件不存在，请检查文件标识符']);
            }
        } catch (\Exception $e) {
            return json(['code' => 0, 'msg' => '下载失败: ' . $e->getMessage()]);
        }
    }





    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */
}
